# 创建时间：2025/5/5 星期一 17:37
# 创建人：李德才

import sys
import time

""" 
分代回收（Generational GC）‌
为了解决循环引用问题，Python 引入 ‌分代回收‌（基于“弱代假说”：对象存活越久，越不可能被回收）。

机制：
‌分代划分‌：对象按存活时间分为 3 代：

‌第 0 代‌（young generation）：新创建的对象。
‌第 1 代‌（middle generation）：经历过一次 GC 后存活的对象。
‌第 2 代‌（old generation）：经历过多次 GC 后存活的对象。
‌回收触发条件‌：

当 ‌第 0 代‌ 对象数量超过阈值（默认 700），触发 GC。
如果第 0 代经过多次回收（默认 10 次），触发第 1 代回收。
同理，第 1 代回收一定次数（默认 10 次）后触发第 2 代回收。
优点：
减少全局遍历的频率，提升效率。
    """


class Node:
    def __init__(self):
        print(f'创建了一个节点，值为{id(self)}')

    def __del__(self):
        print(f'销毁了一个节点，值为{id(self)}')


a = Node()
print(sys.getrefcount(a))
b = Node()
a.pro = b
b.pro = a
del a
print(sys.getrefcount(b))  # 输出为 3，因为 b.pro 引用了 b，交叉引用没有被销毁

time.sleep(1)
print('*****程序结束,后面的销毁是因为程序结束回收所有对象导致的，而不是因为引用计数为0*****')


"""
标记-清除（Mark and Sweep）‌
分代回收的核心算法是 ‌标记-清除‌，用于检测和回收循环引用的对象。

步骤：
‌标记阶段‌：
从根对象（如全局变量、栈中的变量等）出发，遍历所有可达对象，标记为“存活”。
‌清除阶段‌：
遍历堆中所有对象，清除未被标记的对象（不可达对象）。
示例：
对于循环引用：

a = [1, 2]
b = [3, 4]
a.append(b)
b.append(a)
del a
del b
标记阶段：无法从根对象访问到 a 和 b，因此它们会被标记为不可达。
清除阶段：回收这两个对象的内存。

"""